package com.itheima.d2_upd1;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 目标：完成UDP通信快速入门：实现1发1收。
 *      模拟客户端
 *
 * UDP通信
 * 特点：无连接、不可靠通信。
 * 不事先建立连接；发送端每次把要发送的数据（限制在64KB内）、接收端IP、等信息封装成一个数据包，发出去就不管了。
 * Java提供了一个java.net.DatagramSocket类来实现UDP通信。
 *
 * 客户端：发送数据包        服务端：接收数据包
 *
 * DatagramSocket: 用于创建客户端、服务端
 *      构造器
 * public DatagramSocket()                  创建客户端的Socket对象, 系统会随机分配一个端口号。
 * public DatagramSocket(int port)          创建服务端的Socket对象, 并指定端口号
 *      方法
 * public void send(DatagramPacket dp)      发送数据包
 * public void receive(DatagramPacket p)    使用数据包接收数据
 *
 * DatagramPacket：创建数据包
 *      构造器
 * public DatagramPacket(byte[] buf, int length, InetAddress address, int port)     创建发出去的数据包对象
 * public DatagramPacket(byte[] buf, int length)                                    创建用来接收数据的数据包
 *      方法
 * public int getLength()       获取数据包，实际接收到的字节个数
 *
 *
 * 使用UDP通信实现：发送消息、接收消息
 * 客户端实现步骤
 * 创建DatagramSocket对象（客户端对象）                      扔韭菜的人
 * 创建DatagramPacket对象封装需要发送的数据（数据包对象）                    韭菜盘子
 * 使用DatagramSocket对象的send方法，传入DatagramPacket对象                      开始抛出韭菜
 * 释放资源
 *
 * 服务端实现步骤
 * 创建DatagramSocket对象并指定端口（服务端对象）                      接韭菜的人
 * 创建DatagramPacket对象接收数据（数据包对象）                 韭菜盘子
 * 使用DatagramSocket对象的receive方法，传入DatagramPacket对象                    开始接收韭菜
 * 释放资源
 *
 *
 * 实现UDP通信，如何创建客户端、服务端对象？
 * public DatagramSocket()：创建发送端的Socket对象
 * public DatagramSocket(int port)：创建接收端的Socket对象
 * 数据包对象是哪个？
 * DatagramPacket
 * 如何发送、接收数据？
 * 使用DatagramSocket的如下方法：
 * public void send(DatagramPacket dp)：发送数据包
 * public void receive(DatagramPacket dp) ：接收数据包
 */
public class Client {
    public static void main(String[] args) throws Exception {
        // 1、创建客户端对象（发韭菜出去的人）
        /*
        DatagramSocket用于创建客户端的构造器：
        public DatagramSocket()  创建客户端的Socket对象, 系统会随机分配一个端口号。
        DatagramSocket方法：
        public void send(DatagramPacket dp)      发送数据包
        public int getLength()       获取数据包，实际接收到的字节个数

        DatagramPacket创建数据包的构造器：
        public DatagramPacket(byte[] buf, int length, InetAddress address, int port) 创建发出去的数据包对象
         */

        DatagramSocket socket = new DatagramSocket(7777);   //有异常直接抛出

        // 2、创建数据包对象封装要发出去的数据（创建一个韭菜盘子）
       /* public DatagramPacket(byte buf[], int length,
             InetAddress address, int port)
               参数一：封装要发出去的数据。
               参数二：发送出去的数据大小（字节个数）
               参数三：服务端的IP地址（找到服务端主机）    本案例中服务端IP地址用本机的
               参数四：服务端程序的端口。

          byte[] getBytes(String charsetName)       使用指定的字符集将该 String编码为一系列字节，将结果存储到新的字节数组中
          String(byte[] bytes, String charsetName)    通过指定的字符集解码指定的字节数组来构造新的 String

          public static InetAddress getLocalHost()   获取本机IP，会以一个inetAddress的对象返回
             */
        byte[] bytes = "我是快乐的客户端，我爱你abc".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length
                , InetAddress.getLocalHost(),  6666);

        // 3、开始正式发送这个数据包的数据出去了
        socket.send(packet);

        System.out.println("客户端数据发送完毕~~~");
        socket.close(); // 释放资源！
    }
}
